[libcxx] Enable noexcept for GCC 4.6 and greater Summary: This patch allows GCC 4.6 and above to use `noexcept` as opposed to `throw()`. Is it an ABI safe change to suddenly switch on `noexcept`? I imagine it must be because it's disabled in w/ clang in C++03 but not C++11. Reviewers: danalbert, jroelofs, mclow.lists Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D15516 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@255683 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/__config b/include/__config index ec44f76..5b10a6d 100644 --- a/include/__config +++ b/include/__config 
@@ -401,14 +401,8 @@  #endif // __linux__  #endif   -#if (__has_feature(cxx_noexcept)) -# define _NOEXCEPT noexcept -# define _NOEXCEPT_(x) noexcept(x) -# define _NOEXCEPT_OR_FALSE(x) noexcept(x) -#else -# define _NOEXCEPT throw() -# define _NOEXCEPT_(x) -# define _NOEXCEPT_OR_FALSE(x) false +#if !(__has_feature(cxx_noexcept)) +#define _LIBCPP_HAS_NO_NOEXCEPT  #endif    #if __has_feature(underlying_type) @@ -476,10 +470,6 @@  #define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES  #endif   -#define _NOEXCEPT throw() -#define _NOEXCEPT_(x) -#define _NOEXCEPT_OR_FALSE(x) false -  #ifndef __GXX_EXPERIMENTAL_CXX0X__    #define _LIBCPP_HAS_NO_ADVANCED_SFINAE @@ -493,6 +483,7 @@  #define _LIBCPP_HAS_NO_RVALUE_REFERENCES  #define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS  #define _LIBCPP_HAS_NO_STRONG_ENUMS +#define _LIBCPP_HAS_NO_NOEXCEPT    #else // __GXX_EXPERIMENTAL_CXX0X__   @@ -516,6 +507,7 @@  #endif // _GNUC_VER < 404    #if _GNUC_VER < 406 +#define _LIBCPP_HAS_NO_NOEXCEPT  #define _LIBCPP_HAS_NO_NULLPTR  #endif   @@ -549,15 +541,14 @@  #define _LIBCPP_HAS_NO_UNICODE_CHARS  #define _LIBCPP_HAS_NO_DELETED_FUNCTIONS  #define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS +#define _LIBCPP_HAS_NO_NOEXCEPT  #define __alignof__ __alignof  #define _LIBCPP_NORETURN __declspec(noreturn)  #define _LIBCPP_UNUSED  #define _ALIGNAS(x) __declspec(align(x))  #define _LIBCPP_HAS_NO_VARIADICS   -#define _NOEXCEPT throw () -#define _NOEXCEPT_(x) -#define _NOEXCEPT_OR_FALSE(x) false +    #define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {  #define _LIBCPP_END_NAMESPACE_STD } @@ -577,14 +568,11 @@  #define _LIBCPP_NORETURN __attribute__((noreturn))  #define _LIBCPP_UNUSED   -#define _NOEXCEPT throw() -#define _NOEXCEPT_(x) -#define _NOEXCEPT_OR_FALSE(x) false -  #define _LIBCPP_HAS_NO_TEMPLATE_ALIASES  #define _LIBCPP_HAS_NO_ADVANCED_SFINAE  #define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS  #define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +#define _LIBCPP_HAS_NO_NOEXCEPT  #define _LIBCPP_HAS_NO_NULLPTR  #define _LIBCPP_HAS_NO_UNICODE_CHARS  #define _LIBCPP_HAS_IS_BASE_OF @@ -608,6 +596,14 @@    #endif // __clang__ || __GNUC__ || _MSC_VER || __IBMCPP__   +#ifndef _LIBCPP_HAS_NO_NOEXCEPT +# define _NOEXCEPT noexcept +# define _NOEXCEPT_(x) noexcept(x) +#else +# define _NOEXCEPT throw() +# define _NOEXCEPT_(x) +#endif +  #ifdef _LIBCPP_HAS_NO_UNICODE_CHARS  typedef unsigned short char16_t;  typedef unsigned int char32_t;